#ifndef _MESSAGE_QUEUE_H_
#define _MESSAGE_QUEUE_H_

#include <stdint.h>
#include <stdbool.h>

/**
 * @brief 消息队列结构体
 * 
 * @param buffer     数据缓冲区指针（需预先分配内存）
 * @param elem_size  单个元素大小（字节）
 * @param queue_len  队列总容量（最大元素数量）
 * @param head       队列头指针（读取位置）
 * @param tail       队列尾指针（写入位置）
 */
typedef struct {
    uint8_t *buffer;      
    uint16_t elem_size;   
    uint16_t queue_len;   
    volatile uint16_t head; 
    volatile uint16_t tail; 
} message_queue_t;

/* 初始化队列 */
void mq_init(message_queue_t *mq, void *buffer, 
            uint16_t elem_size, uint16_t queue_len);

/* 基础操作 */
bool mq_send(message_queue_t *mq, const void *data);     // 写入单个元素
bool mq_receive(message_queue_t *mq, void *data);        // 读取单个元素
void mq_clear(message_queue_t *mq);						///	队列清除 



/* 批量操作 */
uint16_t mq_send_bulk(message_queue_t *mq,                // 批量写入
                     const void *data, 
                     uint16_t num_elems);
uint16_t mq_receive_bulk(message_queue_t *mq,             // 批量读取
                        void *data, 
                        uint16_t num_elems);

/* 状态查询 */
uint16_t mq_get_free_space(message_queue_t *mq);         // 剩余空间（元素个数）
uint16_t mq_get_count(message_queue_t *mq);              // 队列元素数量
bool mq_is_empty(message_queue_t *mq);                   // 空队列检测
bool mq_is_full(message_queue_t *mq);                    // 满队列检测

#endif	




